	.section .init; /*声明此处段名为.init*/
	.globl _start; /*声明_start是全局的*/
	.type _start,@function  /*声明_start是函数*/

_start:
.option push /*保存编译设置*/
.option norelax /*禁用相对寻址*/
	nop /*空操作*/
    nop
	la gp, __global_pointer$ /*设置gp全局指针，__global_pointer$来源于链接脚本，与data段关联，指向全局变量*/
.option pop
	la sp, _sp /*设置sp堆栈指针，_sp来源于链接脚本，指向普通的局部变量*/

		/*加载data段，存储需要初始化的全局变量和静态变量*/
	la a0, _data_lma /*程序存储器的data段起始地址 加载至 a0*/
	la a1, _data     /*数据存储器的data段起始地址 加载至 a1*/
	la a2, _edata    /*数据存储器的data段结束地址 加载至 a2*/
	bgeu a1, a2, 2f  /*a1大于等于a2，跳转至往下第一个2标签；否则向下执行*/
1:
	lw t0, (a0)      /*a0指向的地址 写入 t0*/
	sw t0, (a1)      /*t0的数据 写入 a1指向的地址 */
	addi a0, a0, 4   /*a0+4*/
	addi a1, a1, 4   /*a1+4*/
	bltu a1, a2, 1b  /*a1小于a2，跳转至往上第一个1标签；否则向下执行*/
	/*加载data段*/
2:

	/*清空bss段，存储不用初始化的全局变量和静态变量*/
	la a0, __bss_start /*bss段起始地址 加载至 a0*/
	la a1, _end        /*bss段结束地址 加载至 a1*/
	bgeu a0, a1, 2f    /*a0大于等于a1，跳转至往下第一个2标签；否则向下执行*/
1:
	sw zero, (a0)      /*a0指向的地址 写入 0*/
	addi a0, a0, 4     /*a0+4*/
	bltu a0, a1, 1b    /*a0小于a1，跳转至往上第一个1标签；否则向下执行*/
	/*清空bss段*/
2:


## set led
    lui  a5,0x10000
    li      s0,0x20
    sw      s0,0(a5)   #GPIO_ODR=0x10000000

#    j .

## set interrupt vector
    la t0, trap_entry
    csrw	mtvec,t0

## enable interrupt
    li t0, 0x888
    csrw mie,t0
/*
## enable interrupt
#    li t0, 0x888
    li t0, 0x080
    csrw mie,t0


## setup timer

    lui  a5,0x10000
    lui     s0,0x019c0  # 0x19bfcc0 = 27000000
    sw      s0,0x88(a5)   #TIMER_TOP at 0x10000088
    li      s0,1
    sw      s0,0x80(a5)   #TIMER_CTRL at 0x10000080

## enable global mie
    csrsi  mstatus,0x08

## dead_loop
    j .
*/

#	call main   /*main函数*/
	j main


loop:  /*无限循环*/
	j loop

trap_vector_base:/*备用中断向量表*/
	j _start
	.word   0
	.word   0
	.word   0
